Unity 애니메이션 시스템
1. 개요
1. 개요
Unity 애니메이션 시스템은 유니티 엔진 내에서 3D 모델에 움직임을 부여하고 그 흐름을 제어하기 위한 핵심 기능 모음이다. 이 시스템은 게임 캐릭터의 걷기, 뛰기, 공격과 같은 자연스러운 움직임부터, 환경 오브젝트의 상호작용, UI 효과, 그리고 컷신 연출에 이르기까지 다양한 상호작용적 움직임을 구현하는 데 사용된다. 시스템의 핵심은 애니메이터 컨트롤러라는 에셋으로, 이 안에서 스테이트 머신을 구성하여 여러 애니메이션 클립 간의 전환 로직을 관리한다.
시스템은 리깅된 모델에 적용되며, 주로 FBX 형식의 애니메이션 파일을 임포트하여 사용한다. 아바타 시스템을 통해 인간형 모델에 대한 애니메이션 리타겟팅을 지원하여, 하나의 애니메이션을 여러 다른 캐릭터 모델에 재사용할 수 있게 한다. 이 외에도 제너릭과 레거시 애니메이션 타입을 제공하여 비인간형 오브젝트나 이전 시스템과의 호환성을 유지한다.
Unity 애니메이션 시스템은 게임 개발과 3D 그래픽스 분야에서 필수적인 도구로 자리 잡았으며, 모션 캡처 데이터의 통합부터 키 프레임 애니메이션의 직접 제작까지 폭넓은 워크플로를 수용한다. 사용자는 애니메이션 창을 통해 클립을 편집하고, 애니메이션 이벤트를 설정하며, 스크립트를 통해 파라미터를 동적으로 제어함으로써 복잡하고 반응적인 애니메이션을 구축할 수 있다.
2. 애니메이션 창(Animation Window)
2. 애니메이션 창(Animation Window)
애니메이션 창은 유니티 에디터 내에서 애니메이션 클립을 직접 생성하고 편집하는 주요 도구이다. 이 창을 통해 개발자는 게임 오브젝트의 트랜스폼, 머티리얼 속성, 컴포넌트 변수 등 다양한 프로퍼티에 대한 키프레임을 시간축에 따라 배치하여 애니메이션을 제작할 수 있다. 주로 문이 열리거나 UI 요소가 페이드 인되는 것과 같은 단순한 오브젝트의 움직임이나 효과를 만들 때 사용된다.
창 내부에는 키프레임을 시각적으로 표시하는 듀오베이션 곡선 뷰와 이벤트를 삽입할 수 있는 이벤트 트랙이 제공된다. 사용자는 타임라인을 따라 원하는 지점에 키프레임을 추가하고, 각 키프레임에서 오브젝트의 위치, 회전, 크기 등의 값을 설정함으로써 부드러운 움직임을 설계한다. 이렇게 제작된 애니메이션 클립은 이후 애니메이터 컨트롤러의 상태 머신에서 활용된다.
애니메이션 창으로 작업하는 방식은 모션 캡처 데이터를 기반으로 한 복잡한 캐릭터 애니메이션 제작보다는, 프로토타이핑이나 비교적 간단한 프로시저럴 애니메이션 요소를 만들 때 더욱 빛을 발한다. 또한, 애니메이션 이벤트를 특정 프레임에 배치하여 사운드 재생이나 함수 호출을 트리거하는 작업도 이 창에서 수행할 수 있다.
3. 애니메이터 컨트롤러(Animator Controller)
3. 애니메이터 컨트롤러(Animator Controller)
3.1. 상태 머신(State Machine)
3.1. 상태 머신(State Machine)
상태 머신은 애니메이터 컨트롤러의 핵심 구성 요소로, 게임 오브젝트의 다양한 애니메이션 상태와 그 상태 간의 전환 규칙을 시각적으로 정의하는 시스템이다. 이는 캐릭터가 서 있기, 걷기, 뛰기, 점프하기 등과 같은 여러 동작 상태를 가질 때, 각 상태에 해당하는 애니메이션 클립을 할당하고 조건에 따라 상태 간을 부드럽게 전환하도록 설계된다. 상태 머신을 통해 개발자는 복잡한 캐릭터 행동 로직을 직관적인 그래프 형태로 구성하고 관리할 수 있다.
상태 머신은 노드와 전이로 구성된다. 각 노드는 하나의 애니메이션 상태를 나타내며, 노드 사이를 연결하는 화살표는 상태 전이를 의미한다. 전이는 애니메이션 파라미터에 의해 제어되는 조건이 충족될 때 발생한다. 예를 들어, '서 있기' 상태에서 '걷기' 상태로의 전이는 '이동 속도' 파라미터가 0보다 클 때 활성화되도록 설정할 수 있다. 이를 통해 코드 없이도 캐릭터의 행동 흐름을 설계할 수 있다.
상태 머신에는 특별한 상태인 '엔트리 상태'와 '애니 스테이트'가 존재한다. 엔트리 상태는 상태 머신이 실행될 때 처음 진입하는 기본 상태이다. 애니 스테이트는 별도의 상태 머신 그래프를 포함하는 서브 상태 머신으로, 복잡한 상태 논리를 계층적으로 정리하고 재사용성을 높이는 데 사용된다. 또한, 어떤 상태로도 전환되지 않는 '애니 스테이트 머신 비헤이비어'를 통해 특정 로직을 실행할 수도 있다.
이 시스템은 게임 개발에서 캐릭터 인공지능의 기본적인 의사 결정 구조를 구현하는 데 널리 활용된다. 단순한 상태 전환부터 계층적이고 복잡한 행동 트리까지 표현이 가능하여, 3D 그래픽스를 활용한 인터랙티브 콘텐츠 제작에 필수적인 도구이다.
3.2. 애니메이션 블렌드 트리(Blend Tree)
3.2. 애니메이션 블렌드 트리(Blend Tree)
애니메이션 블렌드 트리는 애니메이터 컨트롤러 내부의 특수한 상태 머신 상태로, 여러 개의 애니메이션 클립을 하나의 파라미터 값이나 여러 파라미터 값에 따라 부드럽게 혼합하여 재생하는 기능을 제공한다. 캐릭터의 이동 속도에 따른 걷기와 달리기 애니메이션의 자연스러운 전환, 방향에 따른 회전 애니메이션 블렌딩 등 연속적이고 복합적인 움직임을 구현하는 데 핵심적으로 사용된다.
블렌드 트리는 주로 1D, 2D Simple Directional, 2D Freeform Directional, 2D Freeform Cartesian 등의 타입으로 구분된다. 1D 블렌드 트리는 속도와 같은 단일 애니메이션 파라미터에 따라 두 개 이상의 애니메이션을 선형적으로 혼합한다. 2D 블렌드 트리는 수평 이동과 전진 이동을 나타내는 두 개의 파라미터를 사용하여, 캐릭터가 다양한 방향으로 움직일 때 적합한 애니메이션을 2차원 공간에서 혼합한다. 각 포지션에는 애니메이션 클립이 할당되며, 현재 파라미터 값에 따라 가장 가까운 클립들 사이에서 가중치가 계산되어 최종 애니메이션이 결정된다.
이 시스템을 활용하면 애니메이터 컨트롤러에서 수많은 전이 조건을 설정하지 않고도, 단순한 파라미터 조정만으로 풍부한 애니메이션 표현이 가능해진다. 예를 들어, 조이스틱의 입력 벡터를 바로 2D 블렌드 트리의 파라미터로 연결하면, 캐릭터는 입력 방향과 강도에 맞춰 정지, 걷기, 달리기, 측면 이동, 후진 등 모든 방향의 애니메이션을 매끄럽게 보여줄 수 있다. 이는 게임 개발에서 캐릭터 컨트롤의 직관성과 반응성을 크게 향상시키는 요소이다.
블렌드 트리 설정 시 각 애니메이션 클립의 임계값과 가중치를 적절히 조정해야 원하는 블렌딩 효과를 얻을 수 있다. 또한, 루트 모션이 적용된 애니메이션을 블렌드 트리에 사용할 경우, 속도나 방향 파라미터에 따라 캐릭터의 실제 이동량도 자연스럽게 보간된다. 이는 모션 캡처 데이터를 활용한 고품질 인간형 애니메이션 리타겟팅 작업 결과를 게임 내에서 유기적으로 활용하는 표준 방법론이 되었다.
3.3. 애니메이션 레이어(Animation Layer)
3.3. 애니메이션 레이어(Animation Layer)
애니메이션 레이어는 애니메이터 컨트롤러 내에서 여러 애니메이션 상태를 독립적으로 겹쳐서 재생하고 제어할 수 있게 해주는 기능이다. 하나의 상태 머신 내에서 캐릭터의 기본 동작(예: 걷기, 뛰기)과 상체 동작(예: 조준, 아이템 사용)을 별도의 레이어로 분리하여 동시에 처리할 수 있다. 이를 통해 애니메이션 로직을 모듈화하고 복잡한 동작 조합을 효율적으로 구현하는 데 유용하다.
각 애이메이션 레이어는 가중치(Weight)와 블렌딩 모드(Blending Mode)를 설정할 수 있다. 가중치는 해당 레이어의 애니메이션이 최종 본 변형에 얼마나 영향을 미칠지 결정하며, 블렌딩 모드는 오버라이드(Override)와 애디티브(Additive)로 구분된다. 오버라이드 모드는 상위 레이어의 애니메이션이 하위 레이어의 동일 본 변형을 완전히 대체하는 반면, 애디티브 모드는 상위 레이어의 변형 값을 하위 레이어의 값에 더하는 방식으로 동작한다. 애디티브 모드는 표정 변화나 흔들림 효과와 같은 상대적인 움직임을 추가할 때 주로 사용된다.
애니메이션 레이어는 마스크(Avatar Mask)와 함께 사용될 수 있다. 마스크는 특정 레이어가 신체의 어떤 부분(예: 상체만, 오른팔만)에 영향을 줄지 정의한다. 예를 들어, 기본 레이어에서는 전신을 사용해 달리기 애니메이션을 재생하고, 상위 레이어에는 상체 마스크를 적용해 그 위에서 조준 애니메이션만을 겹쳐 재생하는 방식이다. 이렇게 하면 하체의 달리기 동작과 상체의 조준 동작이 자연스럽게 결합된 최종 애니메이션을 얻을 수 있다.
레이어 간의 실행 순서는 애니메이터 컨트롤러 창에서 레이어의 순서로 결정되며, 일반적으로 하위 레이어(인덱스가 낮은 레이어)부터 평가된다. 애니메이션 파라미터를 공유하거나 레이어별로 독립적으로 정의하여 상태 전환을 제어할 수 있다. 이 구조는 게임 개발에서 캐릭터의 복합적인 행동, 예를 들어 이동 중 공격하기 또는 점프 중 아이템 줍기와 같은 상황을 구현하는 표준적인 방법론으로 자리 잡았다.
3.4. 애니메이션 파라미터(Parameters)
3.4. 애니메이션 파라미터(Parameters)
애니메이션 파라미터는 애니메이터 컨트롤러 내부에서 애니메이션 상태 간의 전환 조건을 정의하거나, 애니메이션 블렌드 트리의 가중치를 제어하는 데 사용되는 변수이다. 이 파라미터들은 스크립트를 통해 실시간으로 값을 변경할 수 있으며, 변경된 값에 반응하여 애니메이션 시스템이 적절한 상태로 전환되거나 블렌드가 조정된다. 이를 통해 게임 플레이 중 캐릭터의 움직임을 동적으로 제어하는 것이 핵심 목적이다.
파라미터는 주로 네 가지 기본 데이터 타입으로 정의된다. 가장 흔히 사용되는 것은 특정 조건이 참인지 거짓인지를 판단하는 Bool 타입과, 0에서 1 사이의 연속된 값을 가지는 Float 타입이다. 또한 정수 값을 저장하는 Int 타입과, 특정 조건이 충족되면 즉시 발동시키는 Trigger 타입이 있다. 애니메이션 상태 머신의 전환(Transition) 설정 창에서는 이러한 파라미터를 조건으로 지정하여, 예를 들어 "Speed 파라미터 값이 0.1보다 클 때 Idle 상태에서 Run 상태로 전환한다"와 같은 규칙을 만들 수 있다.
애니메이션 블렌드 트리에서도 파라미터는 중요한 역할을 한다. 블렌드 트리는 두 개 이상의 애니메이션 클립을 매끄럽게 혼합하는데, 혼합의 비율(가중치)을 제어하는 데 하나 이상의 Float 타입 파라미터가 사용된다. 예를 들어, 캐릭터의 전후좌우 이동 속도를 나타내는 "Velocity X"와 "Velocity Z" 파라미터를 블렌드 트리의 입력으로 연결하면, 입력 조합에 따라 걷기, 달리기, 방향 전환 애니메이션이 자연스럽게 블렌딩된다.
이러한 파라미터의 실제 값은 게임 실행 중 C# 스크립트 상에서 Animator 컴포넌트의 SetFloat, SetBool, SetInteger, SetTrigger 같은 메서드를 호출하여 조작한다. [1] 따라서 개발자는 코드로 게임 로직(예: 플레이어 입력, AI 판단)을 처리하고, 그 결과를 애니메이션 파라미터에 반영함으로써 시각적인 피드백을 구현하게 된다. 이는 게임 개발에서 논리와 표현을 분리하는 효율적인 설계 패턴을 가능하게 한다.
4. 애니메이션 임포트 및 설정
4. 애니메이션 임포트 및 설정
Unity에서 애니메이션을 사용하기 위한 첫 단계는 외부 3D 모델링 소프트웨어에서 제작된 애니메이션 클립을 포함한 FBX 파일이나 기타 지원 형식을 프로젝트로 임포트하는 것이다. 유니티 에디터의 프로젝트 창으로 파일을 끌어다 놓으면, 유니티는 해당 파일을 분석하여 포함된 메시, 머티리얼, 애니메이션 데이터를 에셋으로 생성한다.
임포트된 FBX 파일을 선택하면 인스펙터 창에서 리깅(Rig)과 애니메이션(Animation) 탭을 통해 상세 설정을 할 수 있다. 리깅 탭에서는 애니메이션 타입을 휴머노이드(Humanoid), 제너릭(Generic), 레거시(Legacy) 중에서 선택한다. 휴머노이드 타입은 인간형 캐릭터에 특화되어 아바타 시스템을 통해 다양한 캐릭터 모델 간에 애니메이션을 재사용하는 리타겟팅이 가능하다. 제너릭 타입은 인간형이 아닌 일반적인 오브젝트나 생물에, 레거시 타입은 구형 애니메이션 시스템을 사용할 때 주로 적용된다.
애니메이션 탭에서는 파일에 포함된 여러 애니메이션 데이터를 개별 애니메이션 클립으로 분리하고, 각 클립의 시작/종료 프레임, 루프 여부 등을 설정할 수 있다. 또한 애니메이션의 압축 방식을 설정하여 파일 크기를 줄이고 성능을 최적화할 수 있다. 임포트 설정이 완료되면, 이렇게 생성된 애니메이션 클립은 애니메이터 컨트롤러의 상태 머신에서 사용되거나 스크립트를 통해 직접 재생될 수 있다.
5. 인간형 애니메이션 리타겟팅
5. 인간형 애니메이션 리타겟팅
유니티의 인간형 애니메이션 리타겟팅은 아바타 시스템을 기반으로 동작한다. 이 기능은 한 캐릭터 모델에 제작된 애니메이션을 다른 크기나 구조를 가진 인간형 모델에 재사용할 수 있게 해준다. 핵심은 리깅 과정에서 생성되는 아바타가 뼈대의 구조와 관계를 정의하는 중간 매개체 역할을 한다는 점이다. 따라서 서로 다른 FBX 파일로부터 임포트된 모델이라도 올바르게 설정된 아바타를 공유하면 동일한 애니메이션 클립을 사용할 수 있다.
리타겟팅을 설정하기 위해서는 먼저 모델 임포트 설정에서 애니메이션 타입을 'Humanoid'로 지정해야 한다. 유니티는 자동으로 뼈대 매핑을 시도하며, 대부분의 표준 휴머노이드 구조를 인식한다. 매핑이 정확하지 않은 경우, 아바타 구성 창에서 수동으로 뼈대를 아바타의 해당 근골에 할당하여 보정할 수 있다. 이 과정을 통해 애니메이터는 다양한 캐릭터에 대해 동일한 애니메이터 컨트롤러와 애니메이션 에셋을 적용할 수 있어 작업 효율성이 크게 향상된다.
이 기술은 특히 모션 캡처 데이터를 활용하는 게임 개발 프로젝트에서 필수적이다. 한 세트의 고품질 모션 캡처 애니메이션을 여러 플레이어 캐릭터나 NPC에 적용할 수 있기 때문이다. 또한, 에셋 스토어 등에서 구입한 애니메이션 패키지를 프로젝트의 고유 캐릭터에 바로 사용할 수 있게 해주는 실용적인 장점이 있다. 리타겟팅은 애니메이션 워크플로를 표준화하고 애니메이션 에셋의 재사용성을 극대화하는 유니티 애니메이션 시스템의 핵심 기능 중 하나이다.
6. 루트 모션(Root Motion)
6. 루트 모션(Root Motion)
루트 모션은 게임 캐릭터나 3D 모델의 애니메이션 데이터 자체에 포함된 위치와 회전 변화를 사용하여 해당 게임 오브젝트의 실제 이동을 제어하는 기법이다. 일반적인 애니메이션에서는 캐릭터가 제자리에서 달리는 동작만 재생되고, 실제 이동은 스크립트를 통해 별도로 처리된다. 반면 루트 모션을 사용하면 애니메이션 클립이 캐릭터의 수직, 수평 이동 및 회전 정보를 포함하게 되어, 애니메이션 재생만으로도 자연스러운 이동을 구현할 수 있다.
이 기능은 주로 인간형 리깅을 가진 캐릭터에 적용되며, 애니메이터 컨트롤러의 설정에서 활성화할 수 있다. 애니메이터 컴포넌트에는 루트 모션 적용 방식을 결정하는 'Apply Root Motion' 프로퍼티가 있다. 이를 '켬'으로 설정하면 애니메이션에 따른 이동이 트랜스폼에 자동으로 적용되고, '끔'으로 설정하면 스크립트를 통한 수동 제어가 가능해진다.
루트 모션의 주요 장점은 모션 캡처 데이터나 미리 제작된 고품질 애니메이션에서 추출된 정확하고 물리적으로 올바른 이동을 게임 내에 그대로 반영할 수 있다는 점이다. 이를 통해 캐릭터의 걸음걸이, 방향 전환, 점프와 착지 등의 동작이 매우 자연스럽고 일관성 있게 표현된다. 특히 달리기 속도나 점프 높이 등이 애니메이션마다 고정되어 일관성을 유지해야 하는 경우에 유용하게 사용된다.
그러나 루트 모션은 환경과의 상호작용, 예를 들어 장애물 회피나 사용자 입력에 따른 즉각적인 반응 처리에서 한계를 보일 수 있다. 이러한 경우에는 애니메이션의 루트 모션 이동 벡터를 스크립트에서 읽어온 후(OnAnimatorMove 콜백 사용), 필요에 따라 수정하거나 다른 물리 시스템과 혼합하여 사용하는 방법으로 유연성을 확보할 수 있다.
7. 애니메이션 이벤트(Animation Events)
7. 애니메이션 이벤트(Animation Events)
애니메이션 이벤트는 애니메이션 클립의 특정 시간 지점에 함수 호출을 예약할 수 있는 기능이다. 이는 애니메이션 재생 과정에서 게임플레이 로직을 정확한 타이밍에 실행하고자 할 때 유용하다. 예를 들어, 캐릭터의 발걸음 소리를 발이 땅에 닿는 순간에 재생하거나, 공격 모션에서 실제 타격이 발생하는 프레임에 데미지 계산 함수를 호출하는 데 활용된다. 이벤트는 애니메이션 창을 통해 시각적으로 추가하고 관리할 수 있으며, 애니메이터 컨트롤러가 아닌 개별 애니메이션 클립 자체에 속한다.
이벤트를 설정하려면 먼저 애니메이션 창에서 원하는 애니메이션 클립을 열고, 이벤트를 추가할 타임라인 위치를 선택한다. 그 후 이벤트 추가 버튼을 누르거나 타임라인을 더블 클릭하여 새로운 이벤트 마커를 생성할 수 있다. 생성된 이벤트 마커를 선택하면 인스펙터 창에서 호출할 함수의 이름과 전달할 매개변수(문자열, 정수, 실수 등)를 지정할 수 있다. 이때 호출 대상은 해당 애니메이션 클립이 적용되는 게임 오브젝트나 그 자식 오브젝트에 첨부된 스크립트 내의 공개 함수여야 한다.
애니메이션 이벤트는 주로 사운드 재생, 파티클 시스템 발동, 콜라이더 활성화/비활성화, 게임 상태 변경 등 즉각적인 반응이 필요한 작업에 사용된다. 루트 모션과 결합하여 복잡한 이동 및 상호작용을 구현하거나, 애니메이션 레이어와 함께 사용하여 여러 애니메이션이 혼합되는 상황에서도 정확한 이벤트 호출을 보장할 수 있다. 또한, 애니메이션 임포트 과정에서 외부 3D 모델링 소프트웨어에서 미리 정의된 이벤트를 함께 가져올 수도 있다.
주의할 점은 이벤트가 예상치 못한 타이밍에 반복 호출되지 않도록 설계해야 하며, 애니메이션 재생 속도가 변경되면 이벤트 발생 시간도 함께 변한다는 것이다. 성능 최적화 측면에서는 불필요한 함수 호출을 줄이고, 애니메이션 컴프레션 설정이 이벤트 데이터의 정확성에 영향을 주지 않는지 확인해야 한다. 애니메이터 컨트롤러의 애니메이션 파라미터와 연동하여 더 동적인 이벤트 제어도 가능하다.
8. 스크립트를 통한 애니메이션 제어
8. 스크립트를 통한 애니메이션 제어
Unity에서 애니메이션을 제어하는 주요 방법은 C# 스크립트를 통해 애니메이터 컨트롤러의 애니메이션 파라미터를 조작하는 것이다. Animator 컴포넌트를 가져온 후 SetFloat, SetBool, SetInteger, SetTrigger 등의 메서드를 사용하여 파라미터 값을 변경하면, 이는 상태 머신의 전이 조건으로 작용해 애니메이션 상태 간 전환을 유발한다. 또한 Play 메서드를 사용하여 특정 애니메이션 클립을 직접 재생하거나, CrossFade를 통해 부드러운 전환을 구현할 수도 있다.
스크립트는 애니메이션의 재생 속도, 방향, 루트 모션의 적용 여부 등도 실시간으로 제어할 수 있다. 예를 들어, 캐릭터의 이동 속도에 따라 걷기와 달리기 애니메이션의 속도와 애니메이션 블렌드 트리의 가중치를 동기화하거나, 특정 상호작용 시점에 애니메이션 이벤트를 호출하여 게임플레이 로직(예: 발소리 재생, 공격 판정 생성)과 연동하는 것이 일반적이다.
제어 방식 | 설명 | 주요 메서드/프로퍼티 예시 |
|---|---|---|
파라미터 제어 | 상태 전이를 유발하기 위해 조건값 설정 |
|
직접 재생 | 특정 상태나 애니메이션 클립을 즉시 재생 |
|
전환 제어 | 애니메이션 사이의 부드러운 전환 설정 |
|
재생 정보 조회 | 현재 재생 중인 애니메이션 정보 확인 |
|
이러한 스크립트 기반 제어는 게임 개발에서 캐릭터의 복잡한 행동 패턴, 환경 반응형 상호작용, 그리고 컷신 연출을 구현하는 핵심 수단이 된다. 또한 애니메이션 레이어와 아바타 마스크를 스크립트에서 조절하여 상체와 하체 애니메이션을 독립적으로 제어하는 등 고급 활용도 가능하다.
9. 성능 최적화
9. 성능 최적화
9.1. 애니메이션 컴프레션(Compression)
9.1. 애니메이션 컴프레션(Compression)
애니메이션 컴프레션은 애니메이션 클립의 파일 크기를 줄이고 메모리 사용량을 최적화하기 위한 과정이다. 유니티는 애니메이션 데이터를 저장하는 과정에서 발생할 수 있는 중복 정보를 제거하거나 정밀도를 낮춰 압축한다. 이는 특히 모바일 게임이나 애니메이션이 많은 프로젝트에서 빌드 크기와 런타임 성능을 개선하는 데 중요하다.
유니티는 주로 키프레임 데이터를 대상으로 세 가지 주요 압축 방식을 제공한다. 키프레임 압축은 가장 기본적인 방식으로, 애니메이션 커브에서 불필요한 키를 제거한다. 최적 압축은 키프레임 압축보다 더 공격적으로 데이터를 줄이면서도 시각적 품질을 유지하려고 시도한다. 오류 허용 압축은 지정한 허용 오차 범위 내에서 키 데이터를 근사화하여 압축률을 높인다.
애니메이션 임포트 설정에서 압축 방식을 선택하고 품질 대비 허용 오차 값을 조정할 수 있다. 압축률이 높을수록 파일은 작아지지만, 애니메이션의 정밀도가 떨어져 움직임이 딱딱해지거나 오류가 발생할 수 있다. 따라서 개발자는 프로젝트의 요구사항에 따라 파일 크기와 애니메이션 품질 사이의 적절한 균형을 찾아야 한다. 이 설정은 FBX 파일을 임포트할 때나 프로젝트 뷰의 애니메이션 클립 에셋에서 조정 가능하다.
9.2. 애니메이션 커링(Culling)
9.2. 애니메이션 커링(Culling)
애니메이션 커링은 Unity 엔진이 장면(Scene)에서 현재 보이지 않거나 카메라(Camera) 시야에서 벗어난 오브젝트의 애니메이션 계산을 생략하여 성능을 최적화하는 기능이다. 이는 불필요한 CPU 연산을 줄이고 프레임 레이트를 안정적으로 유지하는 데 핵심적인 역할을 한다.
Unity는 기본적으로 렌더러 컴포넌트가 카메라 시야에 들어오지 않은 오브젝트의 애니메이션 업데이트를 중단한다. 이때 애니메이터 컴포넌트의 Culling Mode 속성을 통해 커링 방식을 세밀하게 제어할 수 있다. 주요 모드로는 애니메이션을 완전히 중지하는 'Cull Completely', 트랜스폼 업데이트만 유지하는 'Cull Update Transform', 그리고 항상 애니메이션을 재생하는 'Always Animate'가 있다.
이 기능은 특히 많은 수의 NPC나 배경 오브젝트가 존재하는 대규모 장면에서 효과적이다. 예를 들어, 플레이어가 방문하지 않은 맵의 반대편에서 수십 개의 캐릭터 애니메이션이 계속 계산된다면 심각한 성능 저하를 초래할 수 있다. 애니메이션 커링은 이러한 불필요한 연산을 사전에 차단한다.
개발자는 프로젝트의 요구사항에 따라 커링 모드를 적절히 설정해야 한다. UI 애니메이션이나 항상 재생되어야 하는 특수 효과는 'Always Animate'로, 배경을 떠도는 새나 구름 같은 오브젝트는 'Cull Update Transform'으로 설정하는 것이 일반적이다. 이를 통해 시각적 품질을 유지하면서도 최적의 성능을 달성할 수 있다.
9.3. 애니메이션 LOD(Level of Detail)
9.3. 애니메이션 LOD(Level of Detail)
애니메이션 LOD(Level of Detail)는 게임의 성능 최적화를 위해 카메라로부터의 거리에 따라 애니메이션의 연산 복잡도를 동적으로 조절하는 기법이다. 이는 주로 멀리 떨어진 캐릭터나 다수의 NPC가 동시에 존재하는 장면에서 프레임 레이트를 안정적으로 유지하는 데 목적이 있다.
구현 방식은 일반적으로 거리에 따른 애니메이션 업데이트 빈도 감소, 본 변환 계산 생략, 또는 단순화된 애니메이션으로 전환하는 형태를 취한다. 예를 들어, 매우 먼 거리의 캐릭터는 애니메이션을 완전히 정지시키거나, 극히 낮은 빈도로만 스켈레탈 애니메이션을 계산할 수 있다. 유니티 엔진에서는 애니메이터 컴포넌트의 'Culling Mode' 속성을 활용하거나, 스크립트를 통해 Animator.updateMode를 제어하는 방식으로 애니메이션 LOD를 구현한다.
이 기법을 효과적으로 사용하려면 게임 디자인 단계에서 시야 내 객체의 예상 분포와 중요도를 고려해야 한다. 또한, LOD 전환 시 발생할 수 있는 애니메이션의 급격한 변화나 팝 현상을 최소화하기 위해 부드러운 전환 로직을 추가하는 것이 일반적이다. 애니메이션 LOD는 애니메이션 커링 및 오클루전 컬링 같은 다른 최적화 기술과 함께 사용될 때 가장 큰 효과를 발휘한다.